Skip to content
14 - Conhecendo os Cookies authored by Fernando M. Oliveira's avatar Fernando M. Oliveira
# 14 - Conhecendo os Cookies #
(branch: cookies)
**Exemplo de uso dos Cookies**
* http://guides.rubyonrails.org/action_controller_overview.html#cookies
* http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html
**Exemplos**
No **1º** em `app/controllers/site/home_controller.rb`, é mostrada a geração e recuperação do dado no cookie.
No **2º** exemplo, o uso do `eval` permite interpretar o dado do cookie (somente texto), e o formatando para uso no ruby (no caso um array).
No **3º** exemplo, o cookie está programado para expirar em 1 hora. Enquanto os outros exemplos são apagados quando a sessão se encerra (ao fechar o browser), este permanecerá até o fim do prazo estipulado.
No **4º** exemplo, usamos a assinatura no cookie configurada em `config/secrets.yml` para oferecer uma camada de proteção, pois autentica que o cookie pertence à aplicação, embaralhando a informação salva no cookie.
No **5º** exemplo, usamos criptografia aliada à assinatura do rails para aumentar ainda mais a camada de proteção.
```
class Site::HomeController < SiteController
def index
#1º exemplo
cookies[:user_name] = "David"
#2º exemplo
cookies[:lat_long] = JSON.generate([47.68, -122.37])
#3º exemplo
cookies[:login] = { value: "XJ-122", expires: 1.hour.from_now }
#4º exemplo
cookies.signed[:user_id] = "Fernando M. Oliveira"
#5º exemplo
cookies.encrypted[:discount] = "EscamboApp"
@categories = Category.order_by_description
@ads = Ad.descending_order(params[:page])
@carousel = Ad.random(3)
puts "============ >> #{cookies[:user_name]}"
puts "============ >> #{eval(cookies[:lat_long]).class}"
end
end
```
Podemos verificar o resultado com a impressão no console usando o `puts`, ou no *Inspetor* do Browser, na parte de *Application*:
![Captura_de_tela_2018-12-13_11.30.43](uploads/178a87b29ceaa74e45239fde95c37113/Captura_de_tela_2018-12-13_11.30.43.png)
**Exemplo no campo de busca do EscamboApp**
Podemos armazenar o termo pesquisado em um cookie e retorná-lo na página quando recarregada. Para isso, precisamos editar o `app/controllers/site/search_controller.rb`:
```
class Site::SearchController < SiteController
def ads
@ads = Ad.search(params[:q], params[:page])
@categories = Category.all
cookies[:search_term] = params[:q]
end
end
```
Em `app/views/layouts/site.html.erb` recurperamos a informação do cookie utilizando o *condicional ternário*:
```
...
<%= text_field_tag(:q, params[:q] ,
{ class:"form-control", placeholder:
"#{cookies[:search_term] ?
cookies[:search_term] :
t('placeholder.search_for')}" }) %>
...
```
**Usando Cookies para Objetos**
Podemos armazenar *Objetos* da Aplicação nos cookies, reduzindo o uso das consultas ao servidor usando o `objetos.to_json` (inclusive usando o `eval` para recuperar como um *Array*).
```
class Site::SearchController < SiteController
def ads
@ads = Ad.search(params[:q], params[:page])
@categories = Category.all
cookies[:search_term] = params[:q]
cookies[:categories] = @categories.to_json
puts "=========================== >> #{cookies[:categories]}"
end
end
```
\ No newline at end of file